State Pattern מימוש מכונת מצבים (FSM) מבוא בעיה תמיכה ועדכונים עדכון מס' 48 מאי 2002

Similar documents
מכונת מצבים סופית תרגול מס' 4. Moshe Malka & Ben lee Volk

טכנולוגיית WPF מספקת למפתחים מודל תכנות מאוחד לחוויית בניית יישומיי

ASP.Net MVC + Entity Framework Code First.

תצוגת LCD חיבור התצוגה לבקר. (Liquid Crystal Display) המערכת.

Practical Session No. 13 Amortized Analysis, Union/Find

קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.

פקס בחיבור המכשיר המשולב לפקס יש לעבור על השלבים הבאים: - חבר את כבל הטלפון לחיבור ה- LINE בגב המדפסת ואת צידו השני לשקע הטלפון בקיר.

Design Patterns מאיר סלע מהדורה ראשונה 2004 הדפסה 1 כל הזכויות שמורות

מבוא לתכנות ב- JAVA תרגול 7

A R E Y O U R E A L L Y A W A K E?

מבוא לתרבות סייבר שיעור מס

המבנה הגאומטרי של מידה

מנגנון 5522 מידע על המנגנון מצב תצוגת שעה

ניפוי שגיאות )Debug( מאת ישראל אברמוביץ

Homework 10. Theoretical Analysis of Service Stations in Steady State. Priority Queues.

Theories of Justice

Summing up. Big Question: What next for me on my Israel Journey?

מבוא למחשב בשפת Matlab

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 102 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 5

מבוא למחשב בשפת פייתון

ANNEXURE "E1-1" FORM OF IRREVOCABLE STANDBY LETTER OF CREDIT PERFORMANCE OF CONTRACT (WHERE PRICES ARE NOT LINKED TO AN ESCALATION FORMULA)

פיזיקה של נהיגה מדריך למורה

סה"כ נקודות סה"כ 31 נקודות סה"כ 21 תוכן עניינים של פתרון המבחן. לולאת for )נתון אלגוריתם... מעקב, פלט

שאלון ו' הוראות לנבחן

זו מערכת ישרת זוית )קרטזית( אשר בה יש לנו 2 צירים מאונכים זה לזה. באותו מישור ניתן להגדיר נקודה על ידי זוית ורדיוס וקטור

שאלון ו' הוראות לנבחן


תרגול 8. Hash Tables

הטכנולוגיה בחינוך ד ר קובי גל אוניברסיטת בן גוריון בנגב

הקיטסיגול הרבחה יעדמל בלושמה גוחה

Hebrew Ulpan HEB Young Judaea Year Course in Israel American Jewish University College Initiative

א נ ג ל י ת בהצלחה! ב. משרד החינוך בגרות לנבחנים אקסטרניים )מילון הראפס אנגלי-אנגלי-ערבי( השימוש במילון אחר טעון אישור הפיקוח על הוראת האנגלית.

IL הוראות הפעלה ההפעלה!

שפת תיאור חומרה VHDL

CML כנס שנתי של מודעות ל- CML 4-6 לאוקטובר 2018, מלון רמדה, חדרה

חוק זכויות הסוכן חוק חוזה סוכנות )סוכן מסחרי וספק(

Depth-First Search DFS

מטוסים נופלים, כורים מתפוצצים זיכרון אוטומטי מקטסטרופות לומדים בניינים קורסים,

בחינת בגרות, תשע"ז מס' שאלון: מדעי המחשב שאלה 1. Java. blog.csit.org.il הילה קדמן

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 134 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 37

Expressions (ex 8) Wild World (ex 7) Cars (ex 9)

נילי חמני

מבחן באנגלית בהצלחה הצלחה!!! שם פרטי: שם משפחה: מס' תעודת זהות: תאריך: שם מרכז מנהל מרכז השכלה: תאריך בדיקת המבחן: כל הזכויות שמורות למשרד החינוך

Computer Structure. Exercise #1 יש להגיש את התשובות הסופיות על גבי טופס זה.

2007 Zindell Technologies, Ltd.

ברוכים הבאים מידע חשוב 1 LG470 תודה שקנית את מכשיר הטלפון הנייד המתקדם והקומפקטי,LG470 שתוכנן לפעול עם טכנולוגית התקשורת הדיגיטלית

מ ש ר ד ה ח י נ ו ך ה פ ד ג ו ג י ת א ש כ ו ל מ ד ע י ם על ה ו ר א ת ה מ ת מ ט י ק ה מחוון למבחן מפמ"ר לכיתה ט', רמה מצומצמת , תשע"ב טור א'

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

תוכן העניינים: פרק סדרות סיכום תכונות הסדרה החשבונית:... 2 תשובות סופיות:...8 סיכום תכונות הסדרה ההנדסית:...10

THINKING ABOUT REST THE ORIGIN OF SHABBOS

מספר השאלון: Thinking Skills נספח: כישורי חשיבה )לפרק ראשון ושני( א נ ג ל י ת (MODULE F) ספרות )מילון הראפס אנגלי-אנגלי-ערבי(

הלעפה תוארוה ילטיגיד יטוחלא ןופלט םגד KX-TCD430BX

מספר ת"ז: יש לסמן את התשובה הטובה ביותר בתשובון. לא יינתן ניקוד על סימון תשובה בטופס הבחינה או במחברת הבחינה.

Name Page 1 of 5. דף ז. This week s bechina begins with the fifth wide line at the top of

עקרונות תכנות מונחה עצמים

אנגלית (MODULE E) בהצלחה!

הבסיס כתיבת התכנית הראשונה שימוש במשתנים. הטיפוס הבסיסי object. הטיפוס הבסיסי string משפטי בקרה. שימוש ב- Enumerations. שימוש ב- Namespaces

סמסטר אביב 2015, מועד ב' סמסטר קיץ 2015, מועד א' מתרגלים: אביב - נורית מושקוביץ', הלאל עאסי, אלירן וייס; קיץ מאיה דיאמנט

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון א' Corresponds with Module A (Without Access to Information from Spoken Texts) גרסה א'

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

הרצאה מספר 10 נושאים לשיעור זה: סיכום הפקודות עד לשיעור זה *** )S-Q( = מקומות בהם ניתן לשלב תתי שאילתות

Genetic Tests for Partners of CF patients

הוראות שימוש לטלפון שולחני IP 9621G

הנדסת תוכנה פרק 8 הנדסת תוכנה

בינה מלאכותית - מבוא והצגת בעיות

Advisor Copy. Welcome the NCSYers to your session. Feel free to try a quick icebreaker to learn their names.

תרגול 01: ממשקים והורשה

שאלון ד' הוראות לנבחן

byte code :(compiler) .class מהדר בתהליך עורך, סייר, קומפיילר,,JRE וכו'. למשל: אקליפס. נקודות חשובות: חסכון בהקצאת זיכרון.

אנגלית שאלון ז' (MODULE G) ג רסה א' הוראות לנבחן )מילון אנגלי-ערבי / ערבי-אנגלי )

SEEDS OF GREATNESS MINING THROUGH THE STORY OF MOSHE S CHILDHOOD

4...Informed Search Strategies Partial Order Planning 29...Hierarchical Decomposition Reenforcement Learning 40...Unsupervised Learning

Rules Game (through lesson 30) by Nancy Decker Preparation: 1. Each rule board is immediately followed by at least three cards containing examples of

תאריך הבחינה: מבוא למדעי המחשב ד "ר פז כרמי פרופ' מייק קודיש ד "ר חן קיסר ד "ר צחי רוזן שם הקורס: מבוא למדעי המחשב מספר הקורס:

Reflection Session: Sustainability and Me

Rabbi Chaiyim Hirschensohn on International Law, Human Rights and the Temple Mount

A JEW WALKS INTO A BAR: JEWISH IDENTITY IN NOT SUCH JEWISH PLACES

ASTM UL / FM / BS abesco

אנגלית ספרות בהצלחה! /המשך מעבר לדף/ נספח: כישורי חשיבה )לפרק ראשון ושני( או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי

Revisionist History: 4 Rabbi Isaac Elchanan Theological Seminary The Benjamin and Rose Berger CJF Torah To-Go Series Av 5774

ל"תוכנה" שכותבים, כמו פונקציה זו, קוראים "קוד"

sharing food intro price & extra drinks * ניתן להזמין מנות כשרות בתאום מראש for good memories

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

הקדמה פרופ' מוטי בן-ארי המחלקה להוראת המדעים מכון ויצמן למדע

Information The marks for questions are shown in brackets. The maximum mark for this paper is 50. You must not use a dictionary.

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

תכנון אלגוריתמים, אביב 2010, תרגול מס' 7 סריקה לעומק, מיון טופולוגי, רכיבים קשירים היטב. time time 1

מערכות ספרתיות ספר תרגילים כל הזכויות שמורות לאתר גול

מיקוד באנגלית. Module D. New Program in English Literature. Option 1 שאלון אינטרני מספר שאלון אקסטרני מספר 414

(MODULE E) ב ה צ ל ח ה!

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

מדריך לניהול VPS טריפל סי מחשוב ענן בע"מ.

NATIONAL COUNCIL OF YOUNG ISRAEL. Shavuot Nation JEWISH EDITION. Compiled by Gabi Weinberg Teen Program Director

פתרון בעיות תכנון בגרף

אנגלית שאלון ז' ג רסה א' הוראות לנבחן בהצלחה! )4( ההנחיות בשאלון זה מנוסחות בלשון זכר ומכוונות לנבחנות ולנבחנים כאחד. (MODULE G)

תמ מהו הקדמה פרופ' מוטי בן-ארי. Peter תמ"ע = עצמים + מחלקות + ירושה. תמ"ע "לייט" לבין תמ"ע אמיתי. Turbo Pascal

תוצאות סקר שימוש בטלפון

תרגול מס' 01 אלגוריתם דיניץ

Transcription:

1 מרכז ההדרכה 2000 תמיכה ועדכונים עדכון מס' 48 מאי 2002 מימוש מכונת מצבים (FSM) באמצעות State Pattern מבוא מכונת מצבים סופית Machine) (Final State היא מודל מקובל בניתוח מערכות באופן כללי, ומערכות חומרה ותוכנה בפרט. במודל זה, ליישות מסויימת נקבעים מספר מצבים בהם היא יכולה להיות, והמעברים בין המצבים מתבצעים כתלות בקלט כלשהו. למעשה, ניתן לתאר כל עצם תוכנה כמכונת מצבים: קבוצת הנתונים שהוא כולל מגדירה את המצב בו הוא נמצא - כלומר, ערכיהם ברגע מסויים מתאר את מצבו באותו רגע. השתנות ערכים אלו כתלות בקלט או באירועים מסויימים מהווה מעבר מצב. במאמר זה נכיר Pattern ידוע לייצוג מכונות מצבים הנקרא,State ונעמוד על יתרונותיו ביחס ללוגיקת משפטי תנאי switch) (if / תוך שימוש בפולימורפיזם מתקדם. להרחבה בנושא State ו- Design Patterns עיין/י בספר "++C - מדריך מקצועי" בהוצאת "מרכז ההדרכה 2000". State Pattern בעיה נדרש לבנות תוכנה עבור מכשיר טלפון סלולרי. בטלפון זה שלושה מקשים עיקריים, מלבד מקשי הספרות/אותיות: call exit menu

2 המכשיר הסלולרי ייוצג ע"י המחלקה,CellPhone שתכלול את השירותים הבאים: CellPhone +call() +showlastcall() +showmenu() +exitmenu() +answer() +disconnect() הסבר: שלוש הפונקציות הראשונות הן פונקציות התגובה ללחיצות על שלושת הכפתורים המתאימים במכשיר: "menu" נלחץ המקש - menubutton() "call" נלחץ המקש - callbutton() "exit" נלחץ המקש - exitbutton() שאר הפונקציות: call() - ביצוע התקשרות showlastcall() - הצגת המספר האחרון שאליו התקשרנו מהמכשיר showmenu() - הצגת התפריט exitmenu() - יציאה מהתפריט answer() - מענה לשיחה (בזמן צלצול) disconnect() - ניתוק השיחה. להלן תרשים המצבים של המערכת: "exit" "menu" "call" Idle "exit" Menu "call" "exit" "exit" Dialing triggerless Talking "call" Ringing לחיצה על "menu" מציגה את התפריט. במידה והתפריט כבר מוצג לא מבוצע דבר. בזמן שיחה, צלצול וחיוג לא מבוצע דבר. לחיצה על "call" גורמת לחיוג למספר המוצג על המסך (קריאה ל-.(call() במידה ולא מוצג מספר כשלהו, לחיצה זו תגרום להצגת המספר האחרון אליו חייגנו (קריאה ל- showlastcall() ). במידה

3 והמכשיר מצלצל, לחיצה על כפתור זה תגרום למענה לשיחה (קריאה ל-.(answer() לחיצה על "exit" גורמת לניתוק השיחה הנוכחית (קריאה ל- (disconnect() במידה ואנו באמצע שיחה, להפסקת הצלצול במידה והמכשיר מצלצל, או להפסקת החיוג כאשר המכשיר במצב חיוג. במצב של הצגת התפריט, לחיצה על "exit" גורמת ליציאה מהתפריט (קריאה ל-.(exitMenu() הערה : המימוש כאן הוא פשטני ואינו כולל את הטיפול המלא בכלל השירותים של מכשיר סלולרי מודרני. פתרון שגוי נגדיר enum של אוסף המצבים האפשריים של המכשיר, ונבצע משפט switch-case בכל פונקצית תגובה לבדיקת המצב הנוכחי. כך מוכרזת המחלקה :CellPhone class CellPhone enum State IDLE, DIALING, RINGING, TALKING, MENU; State m_state; // Buttons input response methods void menubutton(); void callbutton(); void exitbutton(); ; // cellular methods void call(); void showlastcall(); void showmenu(); void exitmenu(); void answer() ; void disconnect(); void CellPhone::menuButton() switch(m_state) case IDLE: m_state = MENU; showmenu(); case DIALING: case RINGING: case TALKING: case MENU: void CellPhone::callButton() // do nothing פונקצית התגובה ללחיצה על :"menu" פונקצית התגובה ללחיצה על :"call"

4 switch(m_state) case IDLE: m_state = MENU; showlastcall(); case RINGING: m_state = TALKING; answer(); case MENU: m_state = DIALING; call(); m_state = TALKING; case DIALING: case TALKING: void CellPhone::exitButton() switch(m_state) case RINGING: case DIALING: case TALKING: disconnect(); m_state = IDLE; case MENU: exitmenu(); m_state = IDLE; // do nothing ופונקצית התגובה ללחיצה על :"exit" case IDLE: // do nothing חסרונות הפתרון: יעילות: חיפוש המצב הנוכחי במשפט switch-case אינו יעיל, מכיוון שבאופן ממוצע, עוברים בכל קריאה לפונקציה כנ"ל על מחצית מספר המצבים. כמו כן משפט switch-case אינו שומר את המידע שנרכש (מציאת המצב המתאים) עבור הפונקציות הבאות, גם כאשר המצב לא שונה. מודולריות: קוד המחלקה CellPhone אינו מודולרי. הטיפול בכל המצבים מבוצע באופן ריכוזי במשפט switch-case במחלקה, ומחייב שינויים במספר מקומות בכל שינוי או הוספה בדרישות היישום.

5 פתרון: State Pattern רעיון הפתרון הוא להשתמש בפולימורפיזם כתחליף למשפט :switch-case נגדיר מחלקת מצב אבסטרקטית,,State ומחלקות נורשות ממנה המייצגות את מצבי המערכת השונים: m_currentstate->menubutton() m_currentstate->callbutton() CellPhone -vector<state*> m_states -m_currentstate +call() +showlastcall() +showmenu() +exitmenu() +answer() +disconnect() +setstate() m_states m_currentstate m_currentstate->exitbutton() 5 «interface» State Idle Dialing Ringing Talking Menu המחלקה CellPhone מחזיקה וקטור של מצביעים ל- (m_states) State ומצביע נוסף ל- State הנוכחי.(m_currentState).CellPhone מחזיקה גם היא מצביע למחלקה State לכל מצב מוגדרת מחלקה מתאימה הנורשת מ- State ומממשת את שלוש פונקציות התגובה ללחיצה על המקשים. כאשר נלחץ המקש "menu" לדוגמא, מופעלת הפונקציה,CellPhone::menuButton() וזו מצבעת הפנייה (Forwarding) לפונקציה,m_currentState->menuButton() כלומר, לפונקציה של המצב הנוכחי. הפונקציות המפנות במחלקה CellPhone הן,inline ולכן אין פה אובדן יעילות בביצוע קריאות עקיפות לפונקציות של.State כך מוכרז הממשק :State class State virtual void menubutton(cellphone *cellphone) = 0; virtual void callbutton(cellphone *cellphone) = 0; virtual void exitbutton(cellphone *cellphone) = 0; ; וכך למשל מוגדרת המחלקה Idle היורשת מ- State ומייצג מצב המתנה: class Idle : public State void menubutton(cellphone *cellphone) cellphone->showmenu(); cellphone->setstate(menu); void callbutton(cellphone *cellphone) cellphone->showlastcall();

6 ; cellphone->setstate(menu); void exitbutton(cellphone *cellphone) הסבר: Idle מממשת את הפונקציות הוירטואליות הטהורות שהוגדרו ב-,State בהתאם למוגדר עבור מצב.IDLE המחלקה הראשית,,CellPhone מבצע הפנייה (forwarding) של קריאות לפונקציות מצב למחלקת המצב הנוכחי: class CellPhone enum State_enum IDLE, DIALING, RINGING, TALKING, MENU, STATE_SIZE; CellPhone() : m_states(state_size) m_states.push_back(new Idle); m_states.push_back(new Dialing); m_states.push_back(new Ringing); m_states.push_back(new Talking); m_states.push_back(new Menu); m_currentstate = m_states[idle]; void setstate(state_enum s) m_currentstate = m_states[s]; // Buttons input response methods void menubutton() m_currentstate->menubutton(this); void callbutton() m_currentstate->callbutton(this); void exitbutton() m_currentstate->exitbutton(this); // cellular methods void call(); void showlastcall(); void showmenu(); void exitmenu(); void answer() ; void disconnect(); private: State* vector<state*> ; m_currentstate; m_states;

7 שיפור נוסף : קינון מחלקות והסתרת מידע מכיוון שהמשתמש במחלקה אינו אמור לעשות שימוש במחלקות המצב, כדאי להגדירן כמקוננות private בתוך המחלקה.CellPhone הקוד המלא של המחלקה נראה אם כן כעת כך: #include <vector> using namespace std; class CellPhone enum State_enum IDLE, DIALING, RINGING, TALKING, MENU, STATE_SIZE; CellPhone() : m_states(state_size) m_states.push_back(new Idle); m_states.push_back(new Dialing); m_states.push_back(new Ringing); m_states.push_back(new Talking); m_states.push_back(new Menu); m_currentstate = m_states[idle]; void setstate(state_enum s) m_currentstate = m_states[s]; // Buttons input response methods void menubutton() m_currentstate->menubutton(this); void callbutton() m_currentstate->callbutton(this); void exitbutton() m_currentstate->exitbutton(this); // cellular methods void call(); void showlastcall(); void showmenu(); void exitmenu(); void answer() ; void disconnect(); private: // state interface class State virtual void menubutton(cellphone *cellphone) = 0; virtual void callbutton(cellphone *cellphone) = 0; virtual void exitbutton(cellphone *cellphone) = 0; ; class Idle : public State void menubutton(cellphone *cellphone) cellphone->showmenu(); cellphone->setstate(menu);

8 ; void callbutton(cellphone *cellphone) cellphone->showlastcall(); cellphone->setstate(menu); void exitbutton(cellphone *cellphone) class Dialing: public State void menubutton(cellphone *cellphone) void callbutton(cellphone *cellphone) void exitbutton(cellphone *cellphone) cellphone->disconnect(); cellphone->setstate(idle); ; class Ringing: public State void menubutton(cellphone *cellphone) void callbutton(cellphone *cellphone) cellphone->answer(); cellphone->setstate(talking); void exitbutton(cellphone *cellphone) cellphone->disconnect(); cellphone->setstate(idle); ; class Talking: public State void menubutton(cellphone *cellphone) void callbutton(cellphone *cellphone) void exitbutton(cellphone *cellphone) cellphone->disconnect(); cellphone->setstate(idle); ; class Menu : public State void menubutton(cellphone *cellphone) void callbutton(cellphone *cellphone) cellphone->call(); cellphone->setstate(dialing); void exitbutton(cellphone *cellphone) cellphone->disconnect(); cellphone->setstate(idle);

9 ; ; State* vector<state*> m_currentstate; m_states; כפי שניתן לראות, פתרון זה עדיף משתי הבחינות שהוזכרו על פני הפתרון הקודם: יעילות: המצב הנוכחי נשמר, ולא מבוצע חיפוש כלשהו. במלים אחרות, לעומת סיבוכיות חיפוש המצב בפתרון הקודם,O(n) הסיבוכיות כאן היא (1)O. מודולריות: הפתרון מודולרי יותר עקב המבנה הפולימורפי. הוספה של מצב חדש מתבטאת בהוספת מחלקה חדשה, ובהוספת עצם ממנה באתחול. כמו כן שינוי בהתנהגות במצב מסוים משפיעה אך ורק על הקוד של מחלקת המצב המתאימה.

10 הכללה State הוא Pattern המשמש להגדרת מכונת מצבים: Context +func1() +func2() m_states m_currentstate «interface» State +func1() +func2() StateA StateB StateC +func1() +func2() +func1() +func2() +func1() +func2() לכל מצב של מחלקה נתונה (context) מגדירים מחלקה היורשת מהממשק State ומממשת את הפונקציות המוכרזות בו. פונקציות אלו מאופיינות בכך שביצוען תלוי במצב של.Context אפשרויות ווריאציות: ה- Context יכול ליצור את וקטור המצבים האפשריים ולהקצות אותם מראש, או באופן הדרגתי, לייצר עצם בהגעה למצב המתאים. שינוי מצב של המערכת: יכול להתבצע ע"י ה-,Context ע"י ה- States או ע"י שניהם. סיכום מימוש מכונת מצבים (FSM) במערכות מונחות עצמים ניתן לביצוע ע"י ה-.State Pattern למימוש זה יתרונות בולטים על פני המימוש המסורתי ע"י משפט :Switch הוא יעיל יותר הוא מודולרי יותר כאשר מספר המצבים רב ו/או קיימת היררכייה של מכונות מצבים (תת מכונות מצבים), המימוש ע"י State Pattern מסורבל ומורכב. במצב זה, פתרון פשוט יותר הוא מימוש ע"י טבלת מעברי מצב. כל הזכויות שמורות מאיר סלע מרכז ההדרכה 2000